%{
	#include "tiger-gram.h"
	#include <string.h>
	#include <stdlib.h>
	#include <stdio.h>
	//extern FILE *yyin;
	extern int nrolinea;
	extern int debugl;
	void printToken(int, char*, int);
	void contarSaltoLinea(char*);	

	
%}
letra	[a-zA-Z]
digito	[0-9]
main	[\_main]
%%

"("			{  printToken(TPARA, yytext, nrolinea);    return TPARA;  }
")"			{  printToken(TPARC, yytext, nrolinea);    return TPARC;  }
"["         {  printToken(TCRA, yytext, nrolinea);     return TCRA;   }
"]"         {  printToken(TCRC, yytext, nrolinea);     return TCRC;   }
"{"			{  printToken(TLLA, yytext, nrolinea);     return TLLA;	  }
"}"			{  printToken(TLLC, yytext, nrolinea);     return TLLC;	  }
","			{  printToken(TCOMA, yytext, nrolinea);    return TCOMA;  }
";"			{  printToken(TPCOMA, yytext, nrolinea);   return TPCOMA; }
":"			{  printToken(T2PUNTOS, yytext, nrolinea); return T2PUNTOS; }
":="		{  printToken(TASIGN, yytext, nrolinea);   return TASIGN; }
"="			{  printToken(TIGUAL, yytext, nrolinea);   return TIGUAL; }
"."			{  printToken(TPUNTO, yytext, nrolinea);   return TPUNTO; }
"+"			{  printToken(TMAS, yytext, nrolinea);     return TMAS;   }
"-"			{  printToken(TMENOS, yytext, nrolinea);   return TMENOS; }
"*"			{  printToken(TMULT, yytext, nrolinea);    return TMULT;  }
"/"			{  printToken(TDIV, yytext, nrolinea);     return TDIV;   }
"&"			{  printToken(TAND, yytext, nrolinea);     return TAND;   }
"|"			{  printToken(TOR, yytext, nrolinea);      return TOR;    }
">"			{  printToken(TMAY, yytext, nrolinea);     return TMAY;   }
"<"			{  printToken(TMEN, yytext, nrolinea);     return TMEN;   }
">="		{  printToken(TMAYIG, yytext, nrolinea);   return TMAYIG; }
"<="		{  printToken(TMENIG, yytext, nrolinea);   return TMENIG; }
"<>"		{  printToken(TDIF, yytext, nrolinea);     return TDIF;   }
array		{  printToken(TARRAY, yytext, nrolinea);   return TARRAY; }
break		{  printToken(TBREAK, yytext, nrolinea);   return TBREAK; }
do			{  printToken(TDO, yytext, nrolinea);      return TDO;    }
else		{  printToken(TELSE, yytext, nrolinea);    return TELSE;  }
end			{  printToken(TEND, yytext, nrolinea);     return TEND;   }
for			{  printToken(TFOR, yytext, nrolinea);     return TFOR;   }
if			{  printToken(TIF, yytext, nrolinea);      return TIF;    }
in			{  printToken(TIN, yytext, nrolinea);      return TIN;    }
let			{  printToken(TLET, yytext, nrolinea);     return TLET;   }
nil			{  printToken(TNIL, yytext, nrolinea); 	   return TNIL;	  }
of			{  printToken(TOF, yytext, nrolinea);      return TOF;    }
then		{  printToken(TTHEN, yytext, nrolinea);    return TTHEN;  }
to			{  printToken(TTO, yytext, nrolinea);      return TTO;    }
type 		{  printToken(TTYPE, yytext, nrolinea);    return TTYPE;  }
var			{  printToken(TVAR, yytext, nrolinea);     return TVAR;   }
while		{  printToken(TWHILE, yytext, nrolinea);   return TWHILE; }

"\""(.)*"\"" {  yylval.lexema = (char *)strdup(yytext);   printToken(TCSTRING, yytext, nrolinea);   return TCSTRING; }

{digito}+ { yylval.lexema = (char *)strdup(yytext); printToken(TCTEINT, yytext, nrolinea);  return TCTEINT; }

{letra}+({letra}|{digito}|"_")*|{main} { yylval.lexema = (char *)strdup(yytext);  printToken(TID, yytext, nrolinea);  return TID; }

("/")("*")(.|\n)*"*/" { contarSaltoLinea(yytext); }     

[ \t]+ 		/* obvia espacios en blanco, tabuladores */
\n      	{ nrolinea++; }
.			{ printf("Error Lexico: simbolo %s no valido en la linea %d\n", yytext, nrolinea ); }

%%

void printToken(int token, char* lex, int linea){
	if (debugl == 1){
		printf("token ID: %d , lexema: \"%s\" , #linea: %d\n", token, lex, linea);
	}
}

/* Cuenta los saltos de linea */
void contarSaltoLinea(char* linea){
	int i;	
	for(i = 0; i < strlen(linea); i++)
		if(linea[i] == '\n')
		{ nrolinea++; }		
}




